/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-10-25     郭紧合       the first version
 */
#include "lcd.h"
#include "stdlib.h"
//#include "delay.h"
#include "font.h"

/****************************************************************************************************
//=========================================电源接线================================================//
//5V接DC 5V电源
//3V3 不用接
//GND接地
//=======================================液晶屏数据线接线==========================================//
//本模块默认数据总线类型为8位并行模式
//8位模式接线：8位模式模块接低8位总线，即:
//液晶屏LCD_D0对应单片机PB0
//液晶屏LCD_D1对应单片机PB1
//液晶屏LCD_D2对应单片机PB2
//液晶屏LCD_D3对应单片机PB3
//液晶屏LCD_D4对应单片机PB4
//液晶屏LCD_D5对应单片机PB5
//液晶屏LCD_D6对应单片机PB6
//液晶屏LCD_D7对应单片机PB7
//=======================================液晶屏控制线接线==========================================//
//LCD_RST   接PC5    //复位信号
//LCD_CS    接PC9    //片选信号
//LCD_RS    接PC8    //寄存器/数据选择信号
//LCD_WR    接PC7    //写信号
//LCD_RD    接PC6    //读信号
//=========================================触摸屏触接线=========================================//
//本程序不支持触摸测试
**************************************************************************************************/

//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;

//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
uint16_t DeviceCode;


//******************************************************************
//函数名：  LCD_WR_REG
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    向液晶屏总线写入写16位指令
//输入参数：Reg:待写入的指令值
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_WR_REG(uint8_t data)
{
    LCD_RS_CLR;//写地址
    LCD_CS_CLR;
    DATAOUT(data);
    LCD_WR_CLR;
    LCD_WR_SET;
    LCD_CS_SET;
}

//******************************************************************
//函数名：  LCD_WR_DATA
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    向液晶屏总线写入写16位数据
//输入参数：Data:待写入的数据
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_WR_DATA(uint16_t data)
{
    LCD_RS_SET;
    LCD_CS_CLR;
    DATAOUT(data);
    LCD_WR_CLR;
    LCD_WR_SET;
    LCD_CS_SET;
}
//******************************************************************
//函数名：  LCD_DrawPoint_16Bit
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    8位总线下如何写入一个16位数据
//输入参数：(x,y):光标坐标
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_DrawPoint_16Bit(uint16_t color)
{
#if LCD_USE8BIT_MODEL==1
    LCD_CS_CLR;
    LCD_RD_SET;
    LCD_RS_SET;//写地址
    DATAOUT(color>>8);
    LCD_WR_CLR;
    LCD_WR_SET;
    DATAOUT(color);
    LCD_WR_CLR;
    LCD_WR_SET;
    LCD_CS_SET;
#else
    LCD_WR_DATA(color);
#endif


}

//******************************************************************
//函数名：  LCD_WriteReg
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    写寄存器数据
//输入参数：LCD_Reg:寄存器地址
//          LCD_RegValue:要写入的数据
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
    LCD_WR_REG(LCD_Reg);
    LCD_WR_DATA(LCD_RegValue);
}

//******************************************************************
//函数名：  LCD_WriteRAM_Prepare
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    开始写GRAM
//          在给液晶屏传送RGB数据前，应该发送写GRAM指令
//输入参数：无
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_WriteRAM_Prepare(void)
{
    LCD_WR_REG(lcddev.wramcmd);
}

//******************************************************************
//函数名：  LCD_DrawPoint
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    在指定位置写入一个像素点数据
//输入参数：(x,y):光标坐标
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
    LCD_SetCursor(x,y);//设置光标位置
#if LCD_USE8BIT_MODEL==1
    LCD_CS_CLR;
//    LCD_RD_SET;
    LCD_RS_SET;//写地址
    DATAOUT(POINT_COLOR>>8);
    LCD_WR_CLR;
    LCD_WR_SET;
    DATAOUT(POINT_COLOR);
    LCD_WR_CLR;
    LCD_WR_SET;
    LCD_CS_SET;
#else
    LCD_WR_DATA(POINT_COLOR);
#endif


}

//******************************************************************
//函数名：  LCD_Clear
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    LCD全屏填充清屏函数
//输入参数：Color:要清屏的填充色
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_Clear(uint16_t Color)
{
    uint32_t index=0;
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);
#if LCD_USE8BIT_MODEL==1
    LCD_RS_SET;//写数据
    LCD_CS_CLR;
    for(index=0;index<lcddev.width*lcddev.height;index++)
    {
        DATAOUT(Color>>8);
        LCD_WR_CLR;
        LCD_WR_SET;

        DATAOUT(Color);
        LCD_WR_CLR;
        LCD_WR_SET;
    }
    LCD_CS_SET;
#else //16位模式
    for(index=0;index<lcddev.width*lcddev.height;index++)
    {
        LCD_WR_DATA(Color);
    }
#endif

}

//******************************************************************
//函数名：  LCD_GPIOInit
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    液晶屏IO初始化，液晶初始化前要调用此函数
//输入参数：无
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_GPIOInit(void)
{
    //D7~D0 PA3 PA4 PA5 PE1 PE0 PA6 PA1 PE4
    //LCD_RST   接PE6    //复位信号
    //LCD_CS    接PE7    //片选信号
    //LCD_RS    接PA0    //寄存器/数据选择信号
    //LCD_WR    接PE3    //写信号
    //LCD_RD    接PE2    //读信号
    rt_pin_mode(20, PIN_MODE_OUTPUT);
    rt_pin_mode(0, PIN_MODE_OUTPUT);
    rt_pin_mode(16, PIN_MODE_OUTPUT);
    rt_pin_mode(15, PIN_MODE_OUTPUT);
    rt_pin_mode(19, PIN_MODE_OUTPUT);
    rt_pin_mode(3, PIN_MODE_OUTPUT);
    rt_pin_mode(4, PIN_MODE_OUTPUT);
    rt_pin_mode(5, PIN_MODE_OUTPUT);
    rt_pin_mode(14, PIN_MODE_OUTPUT);
    rt_pin_mode(13, PIN_MODE_OUTPUT);
    rt_pin_mode(6, PIN_MODE_OUTPUT);
    rt_pin_mode(1, PIN_MODE_OUTPUT);
    rt_pin_mode(17, PIN_MODE_OUTPUT);

    rt_pin_write(20, PIN_HIGH);
    rt_pin_write(0, PIN_HIGH);
    rt_pin_write(16, PIN_HIGH);
    rt_pin_write(15, PIN_HIGH);
    rt_pin_write(19, PIN_HIGH);
    rt_pin_write(3, PIN_HIGH);
    rt_pin_write(4, PIN_HIGH);
    rt_pin_write(5, PIN_HIGH);
    rt_pin_write(14, PIN_HIGH);
    rt_pin_write(13, PIN_HIGH);
    rt_pin_write(6, PIN_HIGH);
    rt_pin_write(1, PIN_HIGH);
    rt_pin_write(17, PIN_HIGH);

//    rt_pin_mode(18, PIN_MODE_OUTPUT);
//    rt_pin_mode(20, PIN_MODE_OUTPUT);
//    rt_pin_mode(9, PIN_MODE_OUTPUT);
//    rt_pin_mode(10, PIN_MODE_OUTPUT);
//    rt_pin_mode(19, PIN_MODE_OUTPUT);
//    rt_pin_mode(21, PIN_MODE_OUTPUT);
//    rt_pin_mode(13, PIN_MODE_OUTPUT);
//    rt_pin_mode(14, PIN_MODE_OUTPUT);
//    rt_pin_mode(5, PIN_MODE_OUTPUT);
//    rt_pin_mode(8, PIN_MODE_OUTPUT);
//    rt_pin_mode(22, PIN_MODE_OUTPUT);
//    rt_pin_mode(6, PIN_MODE_OUTPUT);
//    rt_pin_mode(16, PIN_MODE_OUTPUT);
}

//******************************************************************
//函数名：  LCD_Reset
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    LCD复位函数，液晶初始化前要调用此函数
//输入参数：无
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_RESET(void)
{
    LCD_RST_CLR;
    rt_thread_mdelay(100);
    LCD_RST_SET;
    rt_thread_mdelay(50);
}

//******************************************************************
//函数名：  LCD_Init
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    LCD初始化
//输入参数：无
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_Init(void)
{

    LCD_GPIOInit();
    LCD_RESET();

    //************* Start Initial Sequence **********//
    //ILI9486初始化
    LCD_WR_REG(0XF9);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x08);

    LCD_WR_REG(0xC0);
    LCD_WR_DATA(0x19);//VREG1OUT POSITIVE
    LCD_WR_DATA(0x1a);//VREG2OUT NEGATIVE

    LCD_WR_REG(0xC1);
    LCD_WR_DATA(0x45);//VGH,VGL    VGH>=14V.
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC2);
    LCD_WR_DATA(0x33);

    LCD_WR_REG(0XC5);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x28);//VCM_REG[7:0]. <=0X80.

    LCD_WR_REG(0xB1);//OSC Freq set.
    LCD_WR_DATA(0x90);//0xA0=62HZ,0XB0 =70HZ, <=0XB0.
    LCD_WR_DATA(0x11);

    LCD_WR_REG(0xB4);
    LCD_WR_DATA(0x02); //2 DOT FRAME MODE,F<=70HZ.

    LCD_WR_REG(0xB6);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x42);//0 GS SS SM ISC[3:0];
    LCD_WR_DATA(0x3B);

    LCD_WR_REG(0xB7);
    LCD_WR_DATA(0x07);

    LCD_WR_REG(0xE0);
    LCD_WR_DATA(0x1F);
    LCD_WR_DATA(0x25);
    LCD_WR_DATA(0x22);
    LCD_WR_DATA(0x0B);
    LCD_WR_DATA(0x06);
    LCD_WR_DATA(0x0A);
    LCD_WR_DATA(0x4E);
    LCD_WR_DATA(0xC6);
    LCD_WR_DATA(0x39);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0XE1);
    LCD_WR_DATA(0x1F);
    LCD_WR_DATA(0x3F);
    LCD_WR_DATA(0x3F);
    LCD_WR_DATA(0x0F);
    LCD_WR_DATA(0x1F);
    LCD_WR_DATA(0x0F);
    LCD_WR_DATA(0x46);
    LCD_WR_DATA(0x49);
    LCD_WR_DATA(0x31);
    LCD_WR_DATA(0x05);
    LCD_WR_DATA(0x09);
    LCD_WR_DATA(0x03);
    LCD_WR_DATA(0x1C);
    LCD_WR_DATA(0x1A);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0XF1);
    LCD_WR_DATA(0x36);
    LCD_WR_DATA(0x04);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3C);
    LCD_WR_DATA(0x0F);
    LCD_WR_DATA(0x0F);
    LCD_WR_DATA(0xA4);
    LCD_WR_DATA(0x02);

    LCD_WR_REG(0XF2);
    LCD_WR_DATA(0x18);
    LCD_WR_DATA(0xA3);
    LCD_WR_DATA(0x12);
    LCD_WR_DATA(0x02);
    LCD_WR_DATA(0x32);
    LCD_WR_DATA(0x12);
    LCD_WR_DATA(0xFF);
    LCD_WR_DATA(0x32);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0XF4);
    LCD_WR_DATA(0x40);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x08);
    LCD_WR_DATA(0x91);
    LCD_WR_DATA(0x04);

    LCD_WR_REG(0XF8);
    LCD_WR_DATA(0x21);
    LCD_WR_DATA(0x04);

    LCD_WR_REG(0x36);
    LCD_WR_DATA(0x48);

    LCD_WR_REG(0x3A);
    LCD_WR_DATA(0x55);

    LCD_WR_REG(0x11);
    rt_thread_mdelay(120);
    //LCD_WR_REG(0x21);
    LCD_WR_REG(0x29);

    LCD_SetParam();//设置LCD参数
    LCD_Clear(WHITE);
}

//******************************************************************
//函数名：  LCD_SetWindows
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    设置显示窗口
//输入参数：(xStar,yStar):窗口左上角起始坐标
//          (xEnd,yEnd):窗口右下角结束坐标
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{
    LCD_WR_REG(lcddev.setxcmd);
    LCD_WR_DATA(xStar>>8);
    LCD_WR_DATA(0x00FF&xStar);
    LCD_WR_DATA(xEnd>>8);
    LCD_WR_DATA(0x00FF&xEnd);

    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA(yStar>>8);
    LCD_WR_DATA(0x00FF&yStar);
    LCD_WR_DATA(yEnd>>8);
    LCD_WR_DATA(0x00FF&yEnd);

    LCD_WriteRAM_Prepare(); //开始写入GRAM
}

//******************************************************************
//函数名：  LCD_SetCursor
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    设置光标位置
//输入参数：Xpos:横坐标
//          Ypos:纵坐标
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
    LCD_WR_REG(lcddev.setxcmd);
    LCD_WR_DATA(Xpos>>8);
    LCD_WR_DATA(0x00FF&Xpos);
    LCD_WR_DATA(0x0001);
    LCD_WR_DATA(0x003F);

    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA(Ypos>>8);
    LCD_WR_DATA(0x00FF&Ypos);
    LCD_WR_DATA(0x0001);
    LCD_WR_DATA(0x00Df);
    LCD_WriteRAM_Prepare(); //开始写入GRAM
}

//******************************************************************
//函数名：  LCD_SetParam
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    设置LCD参数，方便进行横竖屏模式切换
//输入参数：无
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_SetParam(void)
{
    lcddev.setxcmd=0x2A;
    lcddev.setycmd=0x2B;
    lcddev.wramcmd=0x2C;
#if USE_HORIZONTAL==1   //使用横屏
    lcddev.dir=0;//横屏
    lcddev.width=320;
    lcddev.height=480;
    LCD_WriteReg(0x36,(1<<3)|(0<<6)|(1<<7)|(0<<5));//BGR==1,MX==1,MY==0,MV==1
//    LCD_direction(DFT_SCAN_DIR);
#else//竖屏
    lcddev.dir=0;//竖屏
    lcddev.width=320;
    lcddev.height=480;
    LCD_WriteReg(0x36,(1<<3)|(1<<6)|(1<<7));//BGR==1,MY==0,MX==0,MV==0
#endif
}

////函数需修改，暂时没调用
//void LCD_direction(uint8_t direction )
//{
//    switch(direction){
//        case 3://横屏1
//            lcddev.width=480;
//            lcddev.height=320;
//            LCD_WriteReg(0x36,(1<<3)|(0<<6)|(0<<7)|(1<<5));//BGR==1,MY==1,MX==0,MV==1
//        break;
//        case 1://竖屏1
//            lcddev.width=320;
//            lcddev.height=480;
//            LCD_WriteReg(0x36,(1<<3)|(0<<6)|(1<<7)|(0<<5));//BGR==1,MY==1,MX==0,MV==1
//        break;
//        case 2:
//            lcddev.width=480;
//            lcddev.height=320;
//            LCD_WriteReg(0x36,(1<<3)|(0<<6)|(1<<7)|(0<<5));//BGR==1,MY==0,MX==0,MV==0
//        break;
//        case 0:
//            lcddev.width=320;
//            lcddev.height=480;
////            LCD_WriteReg(0x36,0x0A);
//            LCD_WriteReg(0x36,(1<<3)|(0<<6)|(0<<7));//BGR==1,MY==0,MX==0,MV==0
//        break;
//        default:break;
//    }
//}

//******************************************************************
//函数名：  LCD_DrawLine
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    GUI画线
//输入参数：x1,y1:起点坐标
//          x2,y2:终点坐标
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
    uint16_t t;
    int xerr=0,yerr=0,delta_x,delta_y,distance;
    int incx,incy,uRow,uCol;

    delta_x=x2-x1; //计算坐标增量
    delta_y=y2-y1;
    uRow=x1;
    uCol=y1;
    if(delta_x>0)incx=1; //设置单步方向
    else if(delta_x==0)incx=0;//垂直线
    else {incx=-1;delta_x=-delta_x;}
    if(delta_y>0)incy=1;
    else if(delta_y==0)incy=0;//水平线
    else{incy=-1;delta_y=-delta_y;}
    if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
    else distance=delta_y;
    for(t=0;t<=distance+1;t++ )//画线输出
    {
        LCD_DrawPoint(uRow,uCol);//画点
        xerr+=delta_x ;
        yerr+=delta_y ;
        if(xerr>distance)
        {
            xerr-=distance;
            uRow+=incx;
        }
        if(yerr>distance)
        {
            yerr-=distance;
            uCol+=incy;
        }
    }
}

////******************************************************************
////函数名：  LCD_DrawRectangle
////作者：    xiao冯@全动电子
////日期：    2013-02-22
////功能：    GUI画矩形(非填充)
////输入参数：(x1,y1),(x2,y2):矩形的对角坐标
////返回值：  无
////修改记录：无
////******************************************************************
//void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
//{
//    LCD_DrawLine(x1,y1,x2,y1);
//    LCD_DrawLine(x1,y1,x1,y2);
//    LCD_DrawLine(x1,y2,x2,y2);
//    LCD_DrawLine(x2,y1,x2,y2);
//}

//******************************************************************
//函数名：  LCD_Fill
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    在指定区域内填充颜色
//输入参数：sx:指定区域开始点x坐标
//          sy:指定区域开始点y坐标
//          ex:指定区域结束点x坐标
//          ey:指定区域结束点y坐标
//          color:要填充的颜色
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color)
{

    uint16_t i,j;
    uint16_t width=ex-sx+1;      //得到填充的宽度
    uint16_t height=ey-sy+1;     //高度
    LCD_SetWindows(sx,sy,ex-1,ey-1);//设置显示窗口

#if LCD_USE8BIT_MODEL==1
    LCD_RS_SET;//写数据
    LCD_CS_CLR;
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            DATAOUT(color>>8);
            LCD_WR_CLR;
            LCD_WR_SET;

            DATAOUT(color);
            LCD_WR_CLR;
            LCD_WR_SET;
        }
    }
    LCD_CS_SET;
#else //16位模式
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        LCD_WR_DATA(color); //写入数据
    }
#endif
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口设置为全屏
}

//******************************************************************
//函数名：  LCD_ShowChar
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    显示单个英文字符
//输入参数：(x,y):字符显示位置起始坐标
//          fc:前置画笔颜色
//          bc:背景颜色
//          num:数值（0-94）
//          size:字体大小
//          mode:模式  0,填充模式;1,叠加模式
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_ShowChar(uint16_t x,uint16_t y,uint16_t fc, uint16_t bc, uint8_t num,uint8_t size,uint8_t mode)
{
    uint8_t temp;
    uint8_t pos,t;
    uint16_t colortemp=POINT_COLOR;

    num=num-' ';//得到偏移后的值
    LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口
    if(!mode) //非叠加方式
    {

        for(pos=0;pos<size;pos++)
        {
//            if(size==12)
//            {
//                temp=asc2_1206[num][pos];//调用1206字体
//                for(t=0;t<size/2;t++)
//                {
//                    if(temp&0x01)LCD_DrawPoint_16Bit(fc);
//                    else LCD_DrawPoint_16Bit(bc);
//                    temp>>=1;
//                }
//            }
//            if(size==16)
//            {
//                temp=asc2_1608[num][pos];       //调用1608字体
//                for(t=0;t<size/2;t++)
//                {
//                    if(temp&0x01)LCD_DrawPoint_16Bit(fc);
//                    else LCD_DrawPoint_16Bit(bc);
//                    temp>>=1;
//                }
//            }
            if(size==32)
            {
                temp=asc2_3216[num*2][pos];       //调用1608字体
                for(t=0;t<8;t++)
                {
                    if(temp&0x01)LCD_DrawPoint_16Bit(fc);
                    else LCD_DrawPoint_16Bit(bc);
                    temp>>=1;
                }
//                temp=asc2_3216[num*2+1][pos];       //调用1608字体
//                for(t=0;t<8;t++)
//                {
//                    if(temp&0x01)LCD_DrawPoint_16Bit(fc);
//                    else LCD_DrawPoint_16Bit(bc);
//                    temp>>=1;
//                }
            }
        }
        for(pos=0;pos<size;pos++)
        {
            if(size==32)
            {
//                temp=asc2_3216[num*2][pos];       //调用1608字体
//                for(t=0;t<8;t++)
//                {
//                    if(temp&0x01)LCD_DrawPoint_16Bit(fc);
//                    else LCD_DrawPoint_16Bit(bc);
//                    temp>>=1;
//                }
                temp=asc2_3216[num*2+1][pos];       //调用1608字体
                for(t=0;t<8;t++)
                {
                    if(temp&0x01)LCD_DrawPoint_16Bit(fc);
                    else LCD_DrawPoint_16Bit(bc);
                    temp>>=1;
                }
            }
        }
    }
//    else//叠加方式
//    {
//        for(pos=0;pos<size;pos++)
//        {
//            if(size==12)temp=asc2_1206[num][pos];//调用1206字体
//            else temp=asc2_1608[num][pos];       //调用1608字体
//            for(t=0;t<size/2;t++)
//            {
//                POINT_COLOR=fc;
//                if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点
//                temp>>=1;
//            }
//        }
//    }
    POINT_COLOR=colortemp;
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}

//******************************************************************
//函数名：  LCD_ShowString
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    显示英文字符串
//输入参数：x,y :起点坐标
//          size:字体大小
//          *p:字符串起始地址
//          mode:模式 0,填充模式;1,叠加模式
//返回值：  无
//修改记录：无
//******************************************************************
void LCD_ShowString(uint16_t x,uint16_t y,uint8_t size,uint8_t *p,uint8_t mode)
{
    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
    {
        if(x>(lcddev.width-1)||y>(lcddev.height-1))
        return;
        LCD_ShowChar(x,y,POINT_COLOR,BACK_COLOR,*p,size,mode);
        x+=size/2;
        p++;
    }
}

//******************************************************************
//函数名：  mypow
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    求m的n次方(gui内部调用)
//输入参数：m:乘数
//          n:幂
//返回值：  m的n次方
//修改记录：无
//******************************************************************
uint32_t mypow(uint8_t m,uint8_t n)
{
    uint32_t result=1;
    while(n--)result*=m;
    return result;
}

////******************************************************************
////函数名：  LCD_ShowNum
////作者：    xiao冯@全动电子
////日期：    2013-02-22
////功能：    显示单个数字变量值
////输入参数：x,y :起点坐标
////          len :指定显示数字的位数
////          size:字体大小(12,16)
////          color:颜色
////          num:数值(0~4294967295)
////返回值：  无
////修改记录：无
////******************************************************************
//void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size)
//{
//    uint8_t t,temp;
//    uint8_t enshow=0;
//    for(t=0;t<len;t++)
//    {
//        temp=(num/mypow(10,len-t-1))%10;
//        if(enshow==0&&t<(len-1))
//        {
//            if(temp==0)
//            {
//                LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,' ',size,0);
//                continue;
//            }else enshow=1;
//
//        }
//        LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,temp+'0',size,0);
//    }
//}

//******************************************************************
//函数名：  Gui_Drawbmp16
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    显示一副16位BMP图像
//输入参数：x,y :起点坐标
//          *p :图像数组起始地址
//返回值：  无
//修改记录：无
//******************************************************************
void Gui_Drawbmp16(uint16_t x,uint16_t y,const unsigned char *p) //显示40*40 QQ图片
{
    int i;
    unsigned char picH,picL;
    LCD_SetWindows(x,y,x+40-1,y+40-1);//窗口设置
    for(i=0;i<40*40;i++)
    {
        picL=*(p+i*2);  //数据低位在前
        picH=*(p+i*2+1);
        LCD_DrawPoint_16Bit(picH<<8|picL);
    }
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复显示窗口为全屏
}
//******************************************************************
//函数名：  GUI_DrawPoint
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    GUI描绘一个点
//输入参数：x:光标位置x坐标
//          y:光标位置y坐标
//          color:要填充的颜色
//返回值：  无
//修改记录：无
//******************************************************************
void GUI_DrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
    LCD_SetCursor(x,y);//设置光标位置
    LCD_DrawPoint_16Bit(color);
}
//******************************************************************
//函数名：  _draw_circle_8
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    8对称性画圆算法(内部调用)
//输入参数：(xc,yc) :圆中心坐标
//          (x,y):光标相对于圆心的坐标
//          c:填充的颜色
//返回值：  无
//修改记录：无
//******************************************************************
void _draw_circle_8(int xc, int yc, int x, int y, uint16_t c)
{
    GUI_DrawPoint(xc + x, yc + y, c);

    GUI_DrawPoint(xc - x, yc + y, c);

    GUI_DrawPoint(xc + x, yc - y, c);

    GUI_DrawPoint(xc - x, yc - y, c);

    GUI_DrawPoint(xc + y, yc + x, c);

    GUI_DrawPoint(xc - y, yc + x, c);

    GUI_DrawPoint(xc + y, yc - x, c);

    GUI_DrawPoint(xc - y, yc - x, c);
}
//******************************************************************
//函数名：  gui_circle
//作者：    xiao冯@全动电子
//日期：    2013-02-22
//功能：    在指定位置画一个指定大小的圆(填充)
//输入参数：(xc,yc) :圆中心坐标
//          c:填充的颜色
//          r:圆半径
//          fill:填充判断标志，1-填充，0-不填充
//返回值：  无
//修改记录：无
//******************************************************************
void gui_circle(int xc, int yc,uint16_t c,int r, int fill)
{
    int x = 0, y = r, yi, d;
    d = 3 - 2 * r;
    if (fill)
    {
        // 如果填充（画实心圆）
        while (x <= y) {
            for (yi = x; yi <= y; yi++)
                _draw_circle_8(xc, yc, x, yi, c);

            if (d < 0) {
                d = d + 4 * x + 6;
            } else {
                d = d + 4 * (x - y) + 10;
                y--;
            }
            x++;
        }
    } else
    {
        // 如果不填充（画空心圆）
        while (x <= y) {
            _draw_circle_8(xc, yc, x, y, c);
            if (d < 0) {
                d = d + 4 * x + 6;
            } else {
                d = d + 4 * (x - y) + 10;
                y--;
            }
            x++;
        }
    }
}

//static void lcd_test(void* p)
//{
//    while(1)
//    {
//        /* 5ms */
//        rt_thread_delay(RT_TICK_PER_SECOND/200);
//
//        button_ticks();
//    }
//}

//static int lcd_demo(void)
//{
//    rt_thread_t thread = RT_NULL;
//
//    /* Create background ticks thread */
//    thread = rt_thread_create("lcd", btn_thread_entry, RT_NULL, 512, 10, 10);
//    if(thread == RT_NULL)
//    {
//        return RT_ERROR;
//    }
//    rt_thread_startup(thread);
//
//    return RT_EOK;
//}
//
//MSH_CMD_EXPORT(lcd_demo, lcd demo)
